iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0

常見效能問題

現象 根源 對策
小型高頻非同步造成大量 GC 每次非同步都配置 Task 物件 高同步命中改用 ValueTask 或合併多餘 await
深層 await 堆疊膨脹 多層 return await 只傳遞結果 直接 return Task
介面被阻塞 使用 .Result 等同步等待 呼叫鏈全面 async 函式庫端可加 ConfigureAwait(false)
傳統環境發生死鎖 同步等待阻塞同步內容 避免同步等待 或使用 ConfigureAwait(false)

核心概念

  • 快速路徑 IsCompleted 直接往下執行
  • 真正掛起點 AwaitUnsafeOnCompleted 註冊續接
  • 完成後三步 驗證並設定狀態 → 清理與通知 → 執行續接
  • 效能主軸 減少不必要 Task 配置 降低呼叫堆疊 避免同步阻塞

實驗觀察狀態

static async Task Demo()
{
    Console.WriteLine("1");
    await Task.Yield(); // 產生掛起
    Console.WriteLine("2");
}

var t = Demo();
await t;
Console.WriteLine(t.Status); // RanToCompletion

重點在

  1. async 方法編譯為狀態機與 builder 每個 await 對應 IsCompleted 分支與續點
  2. 未完成的 await 儲存狀態 呼叫 AwaitUnsafeOnCompleted 安排續接
  3. 完成時 builder 呼叫 SetResult 或 SetException 續接於 Task 完成後批次排入
  4. ConfigureAwait(false) 只影響同步內容捕捉 不移除 ExecutionContext
  5. ValueTask 僅在高同步命中且單次等待情境具效益

總結就是聚焦降低額外配置,避免不必要層級,以及杜絕同步封鎖,可穩定改善非同步執行效率


上一篇
IL 對應 await
系列文
新 .NET & Azure & IoT & AI 開源技術實戰手冊 (含深入官方程式碼講解) 26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言